Vorgang im Fertigungsauftrag anlegen
BAPIs sollten eigentlich programmtechnisch das möglich machen, was auch im Dialog möglich ist. Leider gibt es sehr viele Unterschiede zwischen BAPI und entsprechender Dialog-Transaktion.
Im Produktionsumfeld ist es so, dass ein Fertigungsauftrag gar nicht komplett mit Hilfe von BAPIs angelegt werden kann. Die Anlage bzw. Änderung muss in mehrere Schritten erfolgen. Normalerweise reicht es dem BAPI_PRODORD_CREATE unter Angabe einer Materialnummer und eines Werkes um einen Fertigungsauftrag anzulegen.
Aber natürlich gibt es immer Umstände, die eine gezielte Anlage oder Manipulation des Fertigungsauftrags notwendig machen. In diesem Beispiel zeige ich die Anlage eines Vorgangs. Hierfür gibt es leider keinen BAPI und ich verwende den Baustein CO_SE_PRODORD_CHANGE, da dieser problemlos separat aufzurufen war. Es gibt noch den Baustein CO_XT_OPERATION_CHANGE, der jedoch Vorbereitungen mit anderen CO_XT-Bausteinen benötigt.
Code
"Lokale Daten DATA lv_aufnr TYPE aufnr. DATA ls_return TYPE bapiret2. DATA lt_operations TYPE cose_t_operation. DATA ls_operation TYPE cose_s_operation. DATA ls_header TYPE cose_s_header. "Vorgangsdaten ls_operation-standard_value_01 = data-vgw01. ls_operation-standard_value_01_unit = data-vge01. ls_operation-standard_value_02 = data-vgw02. ls_operation-standard_value_02_unit = data-vge02. ls_operation-short_text = data-vorgangstext. ls_operation-sequence = space. ls_operation-operation = data-vornr. ls_operation-work_center = data-arbpl. ls_operation-control_key = data-steus. ls_operation-earliest_end_exec_date = data-endtermin. ls_operation-earliest_end_exec_time = '210000'. ls_operation-base_quantity = data-menge. ls_operation-dispatch_indicator = abap_false. ls_operation-user_field_02_character = data-xyz. ls_operation-standard_value_01_x = abap_true. ls_operation-standard_value_01_unit_x = abap_true. ls_operation-standard_value_02_x = abap_true. ls_operation-standard_value_02_unit_x = abap_true. ls_operation-work_center_x = abap_true. ls_operation-earliest_end_exec_date_x = abap_true. ls_operation-earliest_end_exec_time_x = abap_true. ls_operation-short_text_x = abap_true. ls_operation-base_quantity_x = abap_true. ls_operation-user_field_02_character_x = abap_true. APPEND ls_operation TO lt_operations. SET UPDATE TASK LOCAL. "Anlage/ Änderung des Vorgangs CALL FUNCTION 'CO_SE_PRODORD_CHANGE' EXPORTING iv_order_number = lv_aufnr is_header = ls_header it_operation = lt_operations iv_commit = abap_true IMPORTING es_return = ls_return. export_werks_to_memory( space ). IF ls_return IS INITIAL. COMMIT WORK. ELSE. RAISE EXCEPTION TYPE zcx_order. ENDIF.
Keine Werksänderung möglich
Leider hat der verwendete Baustein eine Einschränkung, die es im Dialog nicht gibt: Es kann kein abweichendes Werk im Vorgang übergeben werden. Dies war jedoch zwingend notwendig. Ich wusste dann keine andere Möglichkeit, als an geeigneter Stelle eine Erweiterungsimplementierung zu erstellen, die das vom Baustein gefundene Default-Werk überschreibt.
Die Erweiterung habe ich im Programm LCO_SEF03 am Ende der FORM-Routine opr_set_default_values gesetzt. Vor Aufruf des Bausteins CO_SE_PROORD_CHANGE exportiere ich das zu verwendende Werk über EXPORT TO MEMORY in den SAP-Speicher. Die Erweiterungsimplementierung überschreibt das Feld gs_afvgd-werks mittels IMPORT FROM MEMORY (sofern vorhanden). Hiermit ist nur die Anlage oder Änderung eines Vorgangs möglich. Für das Ändern mehrerer Vorgänge muss die Logik entsprechend angepasst werden und man muss in der Erweiterung prüfen, welcher Vorgang gerade bearbeitet wird.
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024